package com.etl.scheduler;

import com.etl.util.DateUtil;
import com.etl.entity.EtlTaskBatch;
import com.etl.service.IEtlBatchSchedulerService;
import com.etl.service.IEtlTaskMainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;


import javax.annotation.Resource;

/**
 * @author ：poplar
 * @date ：Created in 2020/4/26 1:55 下午
 * @description：自动执行调度器
 * @modified By：
 * @version: 1.0$
 */
@Slf4j
@EnableScheduling
@Component
public class EtlBatchScheduler {

    @Resource
    private IEtlBatchSchedulerService batchSchedulerService;


    @Resource
    private IEtlTaskMainService etlTaskService;

    // 最小时间
    private final static String minSecond = "00:00:03";

    /**
     * - 任务调度器实现
     * - 定时任务调度器：固定间隔执行一次（5秒）
     * - 判断是否需要取出一个新的任务执行
     * - 取出将要执行的任务：
     * - 执行任务：
     */
    //@Scheduled(cron = "0/5 * * * * ?")
    public void batchScheduler() {

        log.info("---------------------------------- * 华丽的分割线 * ----------------------------------");
        // 生成任务
        creatBatchTask();

        // 超时时间
        String delayTime = String.valueOf(System.currentTimeMillis() + 2 * 60 * 60);

        // 1. 判断任务是否执行
        // 上锁并判断当前是否有任务在执行中。。。
        boolean lock = batchSchedulerService.lockBatchTask(delayTime);
        if (!lock) {
            // 1.1 当前有任务正在执行
            log.info("【定时任务】：{}-start 当前有批次在执行抽取中", DateUtil.getCurrent());
            return;
        }

        // 1.2 当前没有任务执行
        // 2. 取出一个新的任务
        EtlTaskBatch task = batchSchedulerService.getTask();
        if (task == null) {
            // 当前没有需要执行的任务，解锁。判断是否有任务执行时，会上锁
            batchSchedulerService.unlockBatchTask(delayTime);
            log.info("【定时任务】：{}-获取任务: 未找到待执行任务", DateUtil.getCurrent());
            return;
        }

        // 3. 删除任务
        int i = batchSchedulerService.deleteTask(task);
        if (i < 1) {
            log.error("【定时任务】：{}-删除任务失败,任务id={}", DateUtil.getCurrent(), task.getTaskId());
            // 任务删除失败
        }
        //这里可以根据任务类型 ，执行不同的任务
        log.info("【定时任务】：{} -end 任务跑批结束", DateUtil.getCurrent());
    }


    /**
     * 在每天 0 点之后的第一次定时任务中，将今天要自动执行的任务添加到表中
     */
    private void creatBatchTask() {
        String currentTime = DateUtil.getCurrent();
        String currentDate = DateUtil.getCurrentDate();
        String minDateStr = currentDate + " " + minSecond;
        Long aLong = DateUtil.timeBetween(minDateStr, currentTime);
        if (aLong <= 5000 && aLong > 0) {
            batchSchedulerService.creatTask();
        }
    }


}
